<?php

/**
 * 导入类
 */
use Upload\Storage\FileSystem;
use Upload\File as UploadFile;
use Upload\Validation\Mimetype;
use Upload\Validation\Size;

/**
 * Upload类
 * 
 * 参考：文件上传元数据
 * $data = array(
 *     'name'       => $file->getNameWithExtension(),
 *     'extension'  => $file->getExtension(),
 *     'mime'       => $file->getMimetype(),
 *     'size'       => $file->getSize(),
 *     'md5'        => $file->getMd5(),
 *     'dimensions' => $file->getDimensions()
 * );
 */
class Upload {

    /**
     * 文件上传方法
     *
     * @param array $config 配置对象
     * @return void
     */
    public static function action($config){

        // 获取上传使用的field
        $field = self::_chooseField();

        // 取日期目录名、创建该目录，并生成storage对象
        $dateDirname = File::getDateDirname();
        $dirname = $config['saveTemp'] . '/' . $dateDirname;
        File::mkdir($dirname);
        $storage = new FileSystem($dirname);

        // 生成file对象实例，并添加file对象的验证器
        $file = new UploadFile($field, $storage);
        $file->addValidations([
            new Mimetype($config['allow']),
            new Size($config['size'])
        ]);

        // 获取目录名和文件名称，并设置file对象的文件名
        $filename = File::getNewFilename();
        $file->setName($filename);

        // 开始上传
        try {

            // 上传文件到指定目录下
            $file->upload();

            // 获取扩展名
            $tmp = LString::split($_FILES[$field]['name'], '.');
            $ext = $tmp[count($tmp) - 1];

            // 声明上传到oss的全路径
            $object = $config['dir'] . '/' . $dateDirname . '/' . $filename . '.' . $ext;

            // 声明当前已上传文件全路径
            $filepath = $dirname . '/' . $filename . '.' . $ext;

            // 上传到AliyunOSS
            $section = AliyunOSS::upload(ALIYUN_OSS, $config['bucket'], $object, $filepath);
            if (!$section['success']) {
                self::_end(Res::eLogic('抱歉，文件上传失败！'));
            }

            // 声明url地址
            $url = 'http://' . $config['cdn'] . '/' . $object;

            // 返回上传成功
            self::_end(Res::ok(['url'=> $url]));
        } 
        
        // 上传出错
        catch (\Exception $e) {
            self::_end(Res::eLogic('抱歉，文件上传失败！'));
        }
    }

    /**
     * 判断由哪个字段上传文件
     *
     * @return string
     */
    private static function _chooseField() {

        // 根据是否定义file字段返回使用了哪个field做为上传文件的字段名
        for ($i=0; $i<10; $i++) {
            if (isset($_FILES["file${i}"])) {
                return "file${i}";
            }
        }

        // 如果没有返回正确的字段，则返回空字符串（一定已经出错）
        return '';
    }

    /**
     * 结束程序运行并返回结果
     *
     * @param array $res 结果数组
     * @return void
     */
    private static function _end(array $res) {
        echo json_encode($res);
        exit;
    }
}
